import pandas as pd
# 读取数据
df1 = pd.read_excel('D:/datav/data/水果卖场产品销量数据.xls')
df2 = pd.read_excel('D:/datav/data/水果卖场会员数据.xls')
df3 = pd.read_excel('D:/datav/data/水果卖场销售数据.xls')
#异常数据处理]
df1 = df1.dropna()
df2 = df2.dropna()
df3 = df3.dropna()
# 将两表数据合并
df = df1.merge(df2, on='卖场名称')

# ---------------------------------左上 柱状图 -----------------------------------------------------------------
def h_task1():
    # 先筛选出Types字段为非酒精饮料的数据
    df_1 = df[df['卖场名称'] == '华联生鲜超市']
    # 再按照Goods字段分组统计商品数量
    df_2 = df_1.groupby(['卖场名称']).sum()
    # 取Types字段列
    df_3 = df_2['销量']
    # 转换为DataFrame
    tmp1 = pd.DataFrame(df_3)
    # 将值和索引转换为列表
    v = tmp1.values.tolist()
    name = tmp1.index.tolist()
    # 因为值转换为列表格式为[[],[],[],...],所以创建新列表，将值列表中的值取出
    value = []
    for i in v:
        value.append(i[0])
    # 返回字典格式数据
    return {
        'name': name,  # 商品名
        'value': value  # 商品数
    }

#---------------------------------左中 条形图-------------------------------------------------------------------
def h_task2():
    # 按Goods分组统计商品数量
    df_1 = df.groupby(['卖场名称']).count()
    # 按ID倒序排序
    df_2 = df_1.sort_values(by='ID', ascending=False)
    # 取前10条数据
    tmp = df_2.iloc[0:10, 0:1]
    # 将索引及值转换为列表形式
    name = tmp.index.tolist()
    v = tmp.values.tolist()
    # 因为值转换为列表格式为[[],[],[],...],所以创建新列表，将值列表中的值取出
    value = []
    for i in v:
        value.append(i[0])
    # 值列表翻转，不翻转则会导致图像从上往下数据升序排列
    value.reverse()
    name.reverse()
    # 返回字典格式数据
    return {
        'name': name,  # 商品名
        'value': value  # 商品数量
    }

# ---------------------------------左下 瀑布图 -------------------------------------------------------------------
def h_task3():
    # 按商品类型统计各商品类型数量
    df1 = pd.DataFrame(df.groupby(['卖场名称']).count()['卖场名称'])
    # 计算总商品类型数量
    sum_value = df1.agg({'卖场名称': 'sum'}).tolist()[0]
    # 将商品类型名称及各商品类型数量转换为列表
    name = df1.index.tolist()
    v = df1.values.tolist()
    # 创建新列表，添加‘商品总数’元素及各类商品类型名称元素
    name_list = ['总商品数']
    for n in name:
        name_list.append(n)
    # 创建新列表，添加‘商品总数值’元素及各商品类型值
    value_list = [sum_value]
    # 遍历商品类型数量列表将值添加到value_list列表中
    for i in v:
        value_list.append(i[0])
    # 构造数值差列表,首元素为0
    value2 = [0]
    # 遍历商品数量列表，用前两个数的差减去当前数，获得差值列表
    flag = value_list[0]
    for v in range(1, len(value_list)):
        flag = flag - value_list[v]
        value2.append(flag)
    # 返回字典格式数据
    return {
        'name': name_list,  # 商品类型
        'value': value_list,  # 商品数
        'value2': value2  # 商品差
    }

# ---------------------------------中上 折线图 -------------------------------------------------------------------
def h_task4():
    # 按Types字段分组，统计数量，选Goods字段列，转换为DataFrame格式
    df1 = pd.DataFrame(df.groupby(['卖场名称']).count()['卖场名称'])
    # 筛选出商品数量小于3000的数据，作为滞销商品类型
    df1 = df1[df1['卖场名称'] < 3000]
    # 将索引及值转换为列表
    name = df1.index.tolist()
    v = df1.values.tolist()
    # 因为值转换为列表格式为[[],[],[],...],所以创建新列表，将值列表中的值取出
    value = []
    for i in v:
        value.append(i[0])
    # 返回字典格式数据
    return {
        'name': name,  # 商品类型
        'value': value  # 商品数量
    }

# --------------------------------- 中中 雷达图-------------------------------------------------------------------
def h_task5():
    # 按Types字段分组，统计数量，选Goods字段列数据
    df0 = df[df['卖场名称'] == '熟食']
    df1 = df0.groupby(['卖场名称']).count()
    # 取Types字段列
    df2 = df1['卖场名称']
    # 转换为DataFrame
    tmp1 = pd.DataFrame(df2)
    # 将值和索引转换为列表
    v = tmp1.values.tolist()
    name = tmp1.index.tolist()
    # 因为值转换为列表格式为[[],[],[],...],所以创建新列表，将值列表中的值取出
    value = []
    for i in v:
        value.append(i[0])
    # 将值和索引转换为列表
    n = name
    # 构造name列表，列表嵌套字典
    namelist = []
    for i in n:
        namelist.append({
            'name': i,  # 商品类型
            'max': 200  # 每个商品数量的边界
        })
    # 返回字典格式数据
    return {
        'name': namelist,  # 商品类型和边界列表
        'value': value  # 商品数量
    }

# --------------------------------- 中下 玫瑰图-------------------------------------------------------------------
def h_task6():
    # 按Types字段分组，统计数量
    df_1 = df.groupby(['卖场名称']).count()
    # 选Goods字段列，转换为DataFrame格式
    df_2 = pd.DataFrame(df_1['卖场名称'])
    # 按Goods字段值降序排序
    df1 = df_2.sort_values(by='卖场名称', ascending=False)
    # 将值和索引转换为列表
    n = df1.index.tolist()
    v = df1.values.tolist()
    # 同时遍历两个列表，将商品类型和商品数量封装为字典，添加到l列表中
    l = []
    for i, k in zip(n, v):
        # 判断是否为农副产品,不加这个判断则为全部商品类型。
        if i in ['熟食', '果蔬', '食品类', '肉类', '米粮调料']:
         l.append({
            'name': i,  # 商品类型
            'value': k[0]  # 商品数量
        })
    # 返回字典形式数据
    return {'data': l}

# --------------------------------- 右上 环形图-------------------------------------------------------------------
def h_task7():
    # 按商品类型分组统计数量，按Goods值进行倒序排序，选出第一个索引值，则为商品数最多的商品类型
    flag = df.groupby(['卖场名称']).count().sort_values(by='卖场名称', ascending=False).index.tolist()[0]
    # 筛选出Types为flag的数据，按Goods字段分组，统计数量，选取ID字段列，转换为DataFrame格式
    df1 = pd.DataFrame(df[df['卖场名称'] == flag].groupby(['卖场名称']).count()['ID'])
    # 将值和索引转换为列表
    n = df1.index.tolist()
    v = df1.values.tolist()
    # 同时遍历两个列表，将商品名和商品数量封装为字典，添加到l列表中
    l = []
    for i, k in zip(n, v):
        l.append({
            'name': i,  # 商品名
            'value': k[0]  # 商品数量
        })
    # 返回字典格式数据
    return {'data': l,'name':flag}

# --------------------------------- 右中 旭日图-------------------------------------------------------------------
def h_task8():
    # 先处理好米粮调料和果蔬的数据。商品类型为商品名称的父类，取商品类型，并转换为列表
    df01 = df[df['卖场名称'] == '米粮调料']
    df02 = df[df['卖场名称'] == '果蔬']
    df0 = pd.concat([df01, df02], axis=0)
    name = df0['卖场名称'].unique().tolist()
    # 创建总数据列表，最为数据存储容器
    data_dict = []
    # 遍历商品类型列表
    for n in name:
        # 创建字典，name为商品类型
        son_dict = {'name': n}
        # 创建儿子列表
        son_list = []
        # 筛选商品类型为n的数据按Goods字段分组统计数量
        df4 = df[df['卖场名称'] == n].groupby(['卖场名称']).count()
        # 将索引和值转换为列表
        son_name = df4.index.tolist()
        son_value = df4.values.tolist()
        # 同时遍历两个列表，将商品名称和商品数量封装为字典，添加到儿子列表中
        for sn, sv in zip(son_name, son_value):
            son_list.append({
                'name': sn,
                'value': sv[0]
            })
        # 为字典添加children字段，值为儿子列表
        son_dict['children'] = son_list
        # 将字典添加到总数据列表中
        data_dict.append(son_dict)
    # 返回字典形式数据
    return {'data': data_dict}

# --------------------------------- 右下 树图-------------------------------------------------------------------
def h_task9():
    # 先处理好熟食和西点的数据。
    df01 = df[df['卖场名称'] == '熟食']
    df02 = df[df['卖场名称'] == '西点']
    df0 = pd.concat([df01, df02], axis=0)
    name = df0['卖场名称'].unique().tolist()
    # 创建总数据列表，最为数据存储容器
    data_dict = []
    # 创建总父级字典
    f_dict = {'name': '即食类'}
    # children列表
    f_list = []
    # 遍历商品类型列表
    for n in name:
        # 创建字典，name为商品类型
        son_dict = {'name': n}
        # 创建儿子列表
        son_list = []
        # 筛选商品类型为n的数据按Goods字段分组统计数量
        df4 = df[df['卖场名称'] == n].groupby(['卖场名称']).count()
        # 将索引和值转换为列表
        son_name = df4.index.tolist()
        son_value = df4.values.tolist()
        # 同时遍历两个列表，将商品名称和商品数量封装为字典，添加到儿子列表中
        for sn, sv in zip(son_name, son_value):
            son_list.append({
                'name': sn,
                'value': sv[0]
            })
        # 为字典添加children字段，值为儿子列表
        son_dict['children'] = son_list
        # 将字典添加到children列表中
        f_list.append(son_dict)
    # 为总数据字典添加children字段，值为children列表
    f_dict['children'] = f_list
    # 将总父级字典添加到总数据列表中
    data_dict.append(f_dict)
    # 返回字典形式数据
    return {'data': data_dict}